home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5m3.s < prev    next >
Text File  |  1994-07-08  |  5KB  |  153 lines

  1.  
  2. ; Lezione5m3.s    "CHIUSURA" DELLA FINESTRA VIDEO CON I DIWSTART/STOP ($8e/$90)
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28. ;
  29.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  30.     move.w    d0,$dff088        ; Facciamo partire la COP
  31.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  32.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  33.  
  34. mouse:
  35.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  36.     bne.s    mouse        ; Se non ancora, non andare avanti
  37.  
  38.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  39.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  40.  
  41.     bsr.w    DIWVERTICALE    ; mostra la funzione dei DIWSTART e DIWSTOP
  42.  
  43. Aspetta:
  44.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  45.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  46.  
  47.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  48.     bne.s    mouse        ; se no, torna a mouse:
  49.  
  50.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  51.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  52.  
  53.     move.l    4.w,a6
  54.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  55.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  56.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  57.     rts            ; USCITA DAL PROGRAMMA
  58.  
  59. ;    Dati
  60.  
  61. GfxName:
  62.     dc.b    "graphics.library",0,0    
  63.  
  64. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  65.     dc.l    0    ; della graphics.library
  66.  
  67. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  68.     dc.l    0
  69.  
  70. ; Questa routine porta a $95 DIWYSTART incrementandolo di uno ogni volta e
  71. ; a $95 DIWYSTOP decrementandolo di uno ogni volta. Quando entrambi i valori
  72. ; sono raggiunti la routine esce senza modificare niente
  73. ; Da notare che il DIWSTIO qua parte da $fe e non da $ff+$2c come al solito.
  74.  
  75. DIWVERTICALE:
  76.     CMPI.B    #$95,DIWYSTOP    ; Siamo arrivati al DIWSTOP giusto?
  77.     BEQ.S    FINITO        ; se si, non dobbiamo procedere oltre
  78.     ADDQ.B    #1,DIWYSTART    ; aggiungiamo 1 allo start
  79.     SUBQ.B    #1,DIWYSTOP    ; sottraiamo 1 allo stop
  80. FINITO:
  81.     RTS            ; Uscita dalla routine
  82.  
  83.  
  84.     SECTION    GRAPHIC,DATA_C
  85.  
  86. COPPERLIST:
  87.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  88.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  89.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  90.     dc.w    $13e,$0000
  91.  
  92.     dc.w    $8E        ; DIWSTART - Inizio finestra video
  93. DIWYSTART:
  94.     dc.b    $2c        ; DIWSTRT $YY
  95.     dc.b    $81        ; DIWSTRT $XX (lo incrementiamo fino a $ff)
  96.  
  97.     dc.w    $90        ; DIWSTOP - Fine finestra video
  98. DIWYSTOP:
  99.     dc.b    $fe        ; DiwStop YY (partiamo dalla linea $fe!!)
  100.     dc.b    $c1        ; DiwStop XX (lo caliamo fino a $00)
  101.     dc.w    $92,$0038    ; DdfStart
  102.     dc.w    $94,$00d0    ; DdfStop
  103.     dc.w    $102,0        ; BplCon1
  104.     dc.w    $104,0        ; BplCon2
  105.     dc.w    $108,0        ; Bpl1Mod
  106.     dc.w    $10a,0        ; Bpl2Mod
  107.  
  108.             ; 5432109876543210
  109.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  110.                     ; 3 bitplanes lowres, non lace
  111. BPLPOINTERS:
  112.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  113.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  114.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  115.  
  116.     dc.w    $0180,$000    ; color0
  117.     dc.w    $0182,$475    ; color1
  118.     dc.w    $0184,$fff    ; color2
  119.     dc.w    $0186,$ccc    ; color3
  120.     dc.w    $0188,$999    ; color4
  121.     dc.w    $018a,$232    ; color5
  122.     dc.w    $018c,$777    ; color6
  123.     dc.w    $018e,$444    ; color7
  124.  
  125.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  126.  
  127. ;    figura
  128.  
  129. PIC:
  130.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  131.                     ; convertita col KEFCON, fatta di
  132.                     ; 3 bitplanes consecutivi
  133.  
  134.     end
  135.  
  136. Questo listato mostra come si possa diminuire la grandezza della finestra
  137. video in senso verticale: se per esempio visualizzassimo solo delle figure
  138. nella parte alta dello schermo, potremmo restringere la finestra, "tagliando"
  139. la parte sotto una certa linea; il byte YY del diwstart/stop e' uguale a quello
  140. del WAIT: un wait $2c07,$fffe aspetta la prima linea bitplane visualizzata,
  141. infatti il DIWSTART e' $2c81. Giunto alla linea $FF, il DIWSTOP riparte da
  142. ZERO: dunque aspettando col diwstop la posizione $2cc1, aspetta la linea
  143. $ff+$2c, ossia 299, ma le linee effettiviamente usate per visualizzare i
  144. bitplane sono 256: dalla $2c (44) alla 299.
  145. In questo esempio influisce anche il fatto che la figura si sposta in basso
  146. assieme all'inizio della visualizzazione della finestra video.
  147. Per vedere meglio cosa succede sul video, sostituite 3 bitplanes "pieni" ossia
  148. con tutti i bit ad 1:
  149.  
  150. PIC:
  151.     dcb.b    40*256*3,$FF
  152.  
  153.